package Numpy;

import java.util.Arrays;

/**
 * 给你一个按 非递减顺序 排序的整数数组 nums，返回 每个数字的平方
 * 组成的新数组，要求也按 非递减顺序 排序。
 * 示例 1： 输入：nums = [-4,-1,0,3,10] 输出：[0,1,9,16,100]
 * 解释：平方后，数组变为 [16,1,0,9,100]，排序后，数组变为 [0,1,9,16,100]
 * 示例 2： 输入：nums = [-7,-3,2,3,11] 输出：[4,9,9,49,121]
 */
public class SquareOfOrderedArray977 {
    public static void main(String[] args) {
        for (int sortedSquare : sortedSquares2(new int[]{-4, -1, 0, 3, 10})) {
            System.out.print(sortedSquare + " ");
        }
    }

    // 暴力法
    public static int[] sortedSquares1(int[] nums) {
        if (nums.length == 1) {
            nums[0] = (int) Math.pow(nums[0], 2);
            return nums;
        }
        for (int i = 0; i < nums.length; i++) {
            nums[i] = (int) Math.pow(nums[i], 2);
        }
        Arrays.sort(nums);
        return nums;
    }

    // 双指针方法
    // 数组由小到大排序，那么平方后的最大值只能在最前面或者后面
    public static int[] sortedSquares2(int[] nums) {
        if (nums.length == 1) {
            nums[0] = (int) Math.pow(nums[0], 2);
            return nums;
        }
        int start = 0;
        int end = nums.length - 1;
        int[] result = new int[nums.length];
        int curIndex = nums.length - 1;
        while (start <= end) {
            if ((int) Math.pow(nums[start], 2) > (int) Math.pow(nums[end], 2)) {
                result[curIndex] = (int) Math.pow(nums[start], 2);
                start++;
                curIndex--;
            } else {
                result[curIndex] = (int) Math.pow(nums[end], 2);
                end--;
                curIndex--;
            }
        }
        return result;
    }

}
